package controller

import (
	"cs-backend/util"
	"fmt"
	"github.com/iris-contrib/middleware/jwt"
	"github.com/kataras/iris/v12"
	"reflect"
)

func Hello(ctx iris.Context) {
	ctx.WriteString("Hello World!")
	ctx.Next() // 执行通过`Done`注册的“after”处理程序。
}

// generate token to use.
func GetTokenHandler(ctx iris.Context) {
	username := ctx.PostValueDefault("username", "leehuajun")
	userid := ctx.PostValueDefault("userid", "100")
	tokenString := util.GenerateToken(username, userid)

	_, _ = ctx.WriteString("Bearer " + tokenString)
	ctx.Next() // 执行通过`Done`注册的“after”处理程序。
}

func CheckAuthenticatedHandler(ctx iris.Context) {
	user := ctx.Values().Get("jwt").(*jwt.Token)

	ctx.Writef("This is an authenticated request\n")
	ctx.Writef("Claim content:\n")

	foobar := user.Claims.(jwt.MapClaims)
	for key, value := range foobar {
		ctx.Writef("%s = %s", key, value)
	}
	ctx.Next() // 执行通过`Done`注册的“after”处理程序。
}

//type ApiResponse struct {
//	Status int         `json:"status"`
//	Msg    interface{} `json:"msg"`
//	Data   interface{} `json:"data"`
//}

func transformer(objects interface{}) interface{} {
	getType := reflect.TypeOf(objects)
	//fmt.Println("get Type is :", getType.Name())

	getValue := reflect.ValueOf(objects)
	//fmt.Println("get all Fields is:", getValue)

	// 获取方法字段
	// 1. 先获取interface的reflect.Type，然后通过NumField进行遍历
	// 2. 再通过reflect.Type的Field获取其Field
	// 3. 最后通过Field的Interface()得到对应的value
	for i := 0; i < getType.Elem().NumField(); i++ {
		field := getType.Elem().Field(i)
		value := getValue.Elem().Field(i).Interface()
		fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value)
	}

	// 获取方法
	// 1. 先获取interface的reflect.Type，然后通过.NumMethod进行遍历
	for i := 0; i < getType.NumMethod(); i++ {
		m := getType.Method(i)
		fmt.Printf("%s: %v\n", m.Name, m.Type)
	}

	return objects
}
